home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 081 / message.arc / MESSAGE.BAS next >
Encoding:
BASIC Source File  |  1988-02-20  |  19.1 KB  |  708 lines

  1.  
  2. '  Program Name:  Message
  3. '
  4. '  Version: 8.2   2-20-88
  5. '
  6.  
  7. '  Another Almost Useful Utility by WalkBro & Kelleher
  8.  
  9. '  Written by:          Butch Walker   161/1
  10. '                         Version 5.0
  11.  
  12. '  Additional credits:  Mike Kelleher  161/521
  13. '                         Version 6.0
  14. '                         (quick option)
  15. '
  16. '                       Mike Bader  120/17
  17. '                         Assistance on Version 8.1
  18. '                         Debugging and new option requests
  19.  
  20. '  Re-written by:       Don Walker     120/20
  21. '                         Version 5.1 - 5.3
  22. '                         Version 7.0
  23. '                         Version 8.0 - ???
  24.  
  25.  
  26. '     Changes made 5.1
  27. '               Added loop, dropped excess code  ;-)
  28. '               Corrected problem with gaps in echo files
  29. '               Added a bit of structure
  30. '               Added some documentation
  31.  
  32.  
  33. '     Changes made 5.2  - released as Message7 by Butch Walker  2-14-88
  34. '               Added "A"  Option
  35. '               Made RA a default choice so that input file is only
  36. '                       required command line parameter.
  37. '               Added more structure
  38. '               Started HEX logic for NewOpus
  39. '               Continued cleaning-up
  40.  
  41. '     Changes made 5.3  - replaced 5.2 in Message7.Arc  2-16-88
  42. '               Improved Counter(x) logic with direct assignment
  43. '                       Significant speed improvement!
  44. '               More structure, improved logic
  45.  
  46. '     Changes made 8.0  - 2-17-88
  47. '               Merged Mike's code  - Q (Quick) option
  48. '               Default is A - most common usage 
  49. '               Goto's are gone from code used!!
  50.  
  51. '     Changes made 8.1  - 2-17-88
  52. '               Changes command line input (a bunch)
  53. '               Provides automatic help screen by typing Message
  54. '                       with no command line parameters
  55. '               Adds /c option for callers within last xx days
  56. '               Adds /p option to _not_ show priv levels in output
  57. '               Adds /o option to denote next parameter is option list
  58. '               Adds /f option to denote that next parameter is input file
  59. '               Adds /n option to denote that this is a "New Opus" user.bbs file
  60. '                       OPUS BBS after Version 1.1 uses hex message areas.
  61. '               Adds /d option to use defaults of:
  62. '                       Option list = "A"
  63. '                       Input file  = "Echo.lst"
  64. '               Made output prettier
  65.  
  66. '     Changes made 8.2  - 2-20-88
  67. '               Fixed two bugs (gasp)
  68. '               Finished help screen (MDW)
  69.  
  70.  
  71.  
  72. '     Changes still desired:
  73.  
  74. '               ?????????????
  75.  
  76. ' If you read this and would like to suggest an improvement or useful option
  77. '       please contact Don Walker Netmail 120/20
  78.  
  79.  
  80. '
  81. '  -----------   CODE  STARTS   -----------------
  82.  
  83.  
  84. ' Default variable type is integer in this module
  85. DEFINT A-Z
  86.  
  87. ' Declare the Comline Subprogram, as well as the number and
  88. ' type of its parameters
  89.  
  90. DECLARE SUB Comline (N, Q$(), Max)
  91.  
  92. DIM Q$(1 TO 15), AREA$(200), AN$(200), ANAME$(200), A(200), Counter(200), D(180), beg(12), mo$(12)
  93.  
  94.  
  95. ' set up array for use with the /c option
  96.  
  97.         FOR mo = 1 TO 12
  98.                 READ mo$(mo)
  99.         NEXT mo
  100.  
  101.         DATA Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
  102.  
  103.  
  104.  
  105.  
  106.  
  107. ' number of days elapsed prior to beginning of month
  108.  
  109.  
  110.         FOR m = 1 TO 12
  111.                 READ beg(m)
  112.         NEXT m
  113.  
  114.         DATA 0,31,59,90,120,151,181,212,243,273,304,334
  115.  
  116.  
  117. 'calculate number of days that have elapsed since 1980
  118. ' this is used in the /c option
  119.  
  120.         today$ = DATE$
  121.         d1 = VAL(LEFT$(today$, 2))
  122.         d2 = VAL(MID$(today$, 4, 2))
  123.         d3 = VAL(RIGHT$(today$, 4)) - 1980
  124.  
  125.         today = beg(d1) + d2 + d3 * 365
  126.  
  127.  
  128.  
  129. Start! = TIMER
  130. CLS
  131.  
  132. ' print program header
  133.  
  134.  
  135. PRINT "                  MESSAGE - ANOTHER ALMOST USEFUL UTILITY"
  136. PRINT "                                Version 8.2"
  137. PRINT "                  Supported by:  BUTCH WALKER NERD'S NOOK"
  138. PRINT "                     Matrix    161/1      415-672-2504"
  139. PRINT
  140. PRINT
  141. PRINT "                       (c) 1988 - WalkBro & Kelleher"
  142. PRINT
  143.  
  144.  
  145.  
  146.  
  147. ' Get what was typed on the command line
  148.  
  149.         CALL Comline(N, Q$(), 10)
  150.  
  151. ' Q$() is what will get passed back
  152.       
  153. current = 0
  154. days = 0
  155. z$ = "A"
  156. Echo$ = "Echo.lst"
  157.  
  158.  
  159. IF N = 0 THEN                   ' if the user type message with no command
  160.                                 ' line parameters, the program will supply
  161.         GOSUB help              ' a one page help screen.
  162.         SYSTEM
  163. ELSE
  164. END IF
  165.  
  166.  
  167.                                 ' convert command line parameters into
  168.                                 ' useful variables and option flags
  169. FOR Arg = 1 TO N
  170.  
  171.         IF Q$(Arg) = "/C" THEN days = VAL(Q$(Arg + 1))
  172.         IF Q$(Arg) = "/P" THEN noprivs = 1
  173.         IF Q$(Arg) = "/O" THEN z$ = Q$(Arg + 1)
  174.         IF Q$(Arg) = "/F" THEN Echo$ = Q$(Arg + 1)
  175.         IF Q$(Arg) = "/N" THEN NewOpus = 1
  176.         IF Q$(Arg) = "/D" THEN
  177.                 z$ = "A"
  178.                 Echo$ = "Echo.lst"
  179.         ELSE
  180.         END IF
  181. NEXT Arg
  182.  
  183.  
  184. IF INSTR(z$, "A") THEN
  185.  
  186.  
  187.  
  188. ' open input file given on Command line   (Echo$)
  189. ' each line contains an Area number and the Echo Name
  190.                                                                
  191.  
  192.  
  193.   OPEN "I", 3, Echo$
  194.         x = 1
  195.         WHILE NOT EOF(3)                  ' grab a line
  196.                 LINE INPUT #3, AREA$(x)   ' temporary array to hold data
  197.                 x = x + 1
  198.         WEND
  199.  
  200.   MaxArea = x       ' number of lines in the input file
  201.                         
  202.  
  203.   FOR x = 1 TO MaxArea
  204.  
  205.         AN$(x) = MID$(AREA$(x), 1, 3)         ' extract area number
  206.         A(x) = VAL(AN$(x))                    ' convert to #
  207.         ANAME$(A(x)) = MID$(AREA$(x), 4, 20)  ' assign echo name to array
  208.        
  209.   NEXT x
  210.  
  211.   MaxEcho = A(MaxArea - 1)        ' Total number of message areas
  212.                                 ' Assumes that highest message area
  213.                                 '   is an EchoMail area.
  214.  
  215. ELSE
  216. END IF
  217.  
  218. TopReportOne:
  219.  
  220.  
  221. L$ = "MESSAGE AREA   ###     ###     ###    ###    ###    ###    ###    ###"
  222. L1$ = "MESSAGE        ###     ###     ###    ###    ###    ###    ###    ###"
  223.  
  224. OPEN "USER.BBS" FOR RANDOM AS #1 LEN = 180
  225.      FIELD #1, 180 AS A$     ' each user record is 180 bytes
  226.      length = 36             ' name filed is 36 bytes
  227.  
  228.  
  229.  
  230.  
  231. ' based upon command line parameters given, branch
  232.  
  233.      IF z$ = "A" THEN GOSUB Readers       ' We will gather data only (DEFAULT)
  234.     
  235.      IF z$ = "R" THEN GOSUB Quick         ' Message readers (quick)
  236.      IF z$ = "RQ" THEN GOSUB Quick        ' Message readers (quick)
  237.     
  238.      IF z$ = "N" THEN GOSUB Quick         ' Non-readers (quick)
  239.      IF z$ = "NQ" THEN GOSUB Quick        ' Non-readers (quick)
  240.     
  241.      IF z$ = "RA" THEN GOSUB Quick        ' Readers (quick) and summary
  242.      IF z$ = "RAQ" THEN GOSUB Quick       ' Readers (quick) and summary
  243.     
  244.      IF z$ = "RAD" THEN GOSUB Readers     ' Readers (detail) and summary
  245.     
  246.      IF z$ = "NA" THEN GOSUB Quick        ' Non-readers (quick) and summary
  247.      IF z$ = "NAQ" THEN GOSUB Quick       ' Non-readers (quick) and summary
  248.  
  249.  
  250. SYSTEM
  251.  
  252. ' sub-routines start here -----------------
  253.  
  254. GetName:
  255.         GET #1
  256.         user = user + 1
  257.  
  258.         FOR x = 1 TO length                     ' create user name
  259.           IF ASC(MID$(A$, x, 1)) = 0 THEN
  260.             x = length
  261.  
  262.                                                 ' Fido uses CHR$(0) to end a string
  263.           ELSE
  264.             b$ = b$ + MID$(A$, x, 1)            ' build it up char by char
  265.  
  266.           END IF
  267.  
  268.         NEXT x
  269.  
  270.         
  271. RETURN
  272.  
  273. LastCalled:
  274.  
  275.         c$ = MID$(A$, 143, 20)          ' last time called
  276.                                         ' 20 bytes alloted
  277.  
  278.  
  279.  
  280.         DayMonth = VAL(MID$(c$, 1, 2))      ' day is two leftmost characters
  281.         Month$ = MID$(c$, 4, 3)             ' month is a 3 character string
  282.                                             '  starting at position 4.
  283.         Year = VAL(MID$(c$, 8, 2))          ' year is a 2 character string
  284.                                             '  starting at position 8.
  285.  
  286.         FOR mo = 1 TO 12                        ' find a match for the month$
  287.                 IF mo$(mo) = Month$ THEN        ' to determine the value 1-12
  288.                     days1 = beg(mo)
  289.                 ELSE
  290.                 END IF
  291.         NEXT mo
  292.  
  293.  
  294.  
  295. DaysSince1980 = DayMonth + days1 + 365 * (Year - 80)
  296. DaysSinceCalled = today - DaysSince1980
  297.           
  298. RETURN
  299.  
  300.  
  301. Counters:
  302. ' key data collection routine
  303.  
  304.     FOR x = 72 TO 113                   ' Message areas and counters
  305.                                         ' are held here. Convert to
  306.                                         ' numbers for ease of use.
  307.  
  308.  
  309.           IF NewOpus = 0 THEN           ' this flag will have to be set upon
  310.                                         ' entry to the program using the
  311.                                         ' /n option.   (NewOpus = 1)
  312.  
  313.  
  314.                 D(x) = ASC(MID$(A$, x, 1))
  315.  
  316.           ELSE                          ' Newer versions of Opus allow for 256
  317.                                         ' message areas and forces the use of
  318.                                         ' HEX values in the systemXX.bbs . Since
  319.                                         ' the User.BBS is set-up in decimal format
  320.                                         ' we must convert back to something that matches
  321.                                         ' the system.bbs
  322.  
  323.                 D(x) = VAL(HEX$(ASC(MID$(A$, x, 1))))
  324.          
  325.           END IF
  326.  
  327.     NEXT x
  328.  
  329.  
  330. '************* PUT AREA # LOGIC HERE ******************
  331.  
  332. ' increment counters for each of the message areas if this user
  333. ' shows having read them
  334.  
  335.  
  336. FOR z = 73 TO 101 STEP 4
  337.               
  338. ' changed for version 5.3
  339.  
  340.                 Counter(D(z)) = Counter(D(z)) + 1
  341.  
  342.  
  343. NEXT z
  344. RETURN        ' done with this routine "Counters"
  345.  
  346. Privs:
  347.  
  348. Pr$ = ""                      ' start with a null string
  349.                               ' test for various priv levels
  350. Priv = ASC(MID$(A$, 141, 1))
  351.  
  352.  
  353.         IF Priv = 0 THEN Pr$ = "Disgrace"
  354.         IF Priv = 2 THEN Pr$ = "Normal"
  355.         IF Priv = 4 THEN Pr$ = "Privel"
  356.         IF Priv = 6 THEN Pr$ = "Extra"
  357.         IF Priv = 8 THEN Pr$ = "AsstSysop"
  358.         IF Priv = 10 THEN Pr$ = "Sysop"
  359.  
  360.                                     ' does this cover all the possibilities anymore?
  361.  
  362. IF Pr$ = "" THEN Pr$ = "Twit"       ' if he ain't one of the above
  363.                                     ' then he's gotta be a twit!
  364. RETURN
  365.  
  366.  
  367. Readers:
  368.  
  369. IF z$ <> "A" THEN
  370.  
  371.         PRINT
  372.         PRINT "Users taking advantage of Message Areas"
  373.         PRINT
  374. ELSE
  375.  
  376. END IF
  377.  
  378. WHILE NOT EOF(1)
  379.   b$ = "": c$ = ""
  380.  
  381.   GOSUB GetName           ' get user name
  382.   GOSUB LastCalled        ' get last time called
  383.  
  384.   IF days = 0 OR days >= DaysSinceCalled THEN    ' check if user is current
  385.             GOSUB Counters                             '   /c option
  386.                                 ' get last message read in up to eight areas
  387.  
  388. ' IF z$ <> "A" THEN             ' we don't need to do the rest of the stuff!
  389.        
  390.  
  391.             Pr$ = "    "
  392.  
  393.             IF noprivs = 0 THEN GOSUB Privs             ' get this guys priviledge level
  394.  
  395.  
  396. ' add all of the message areas together
  397. ' if the sum is greater than one, this guy reads some messages
  398.  
  399.      IF D(75) + D(79) + D(83) + D(87) + D(91) + D(95) + D(99) + D(103) > 0 THEN
  400.  
  401.        
  402.         IF z$ <> "A" THEN GOSUB PrintUser  ' this user read messages print him
  403.         user1 = user1 + 1
  404.         
  405.  
  406.      ELSE
  407.  
  408.      END IF
  409.  
  410.   ELSE
  411.  
  412.   END IF
  413.  
  414. WEND                 ' keep going until all user records have been read
  415.    
  416.                      ' we finished the first part so it's time to see
  417.                      ' if the summary is required.
  418.  
  419.    
  420.     GOSUB BottomReport
  421.  
  422. '  If we make it here it is time to end the program
  423.  
  424. TheEnd! = TIMER
  425.  
  426. PRINT
  427.  
  428. ' used for timing this sucker to see if better code is quicker!
  429.  
  430. 'PRINT " This run took "; TheEnd! - Start!; " seconds"
  431.  
  432. RETURN
  433.  
  434.  
  435.  
  436. Quick:
  437.  
  438. ' starts the section for those not reading the message areas
  439. ' "Who are those turkeys anyway?" "Why do I pay $1000 per month to bring
  440. ' the best of EchoMail to their doorstep?"
  441.  
  442.  
  443. IF INSTR(z$, "N") THEN
  444.  
  445.  
  446.         PRINT
  447.         PRINT "  Users NOT taking advantage of Message Areas";
  448.         IF days > 0 THEN
  449.                 PRINT " during the last "; days; " days."
  450.         ELSE
  451.                 PRINT
  452.         END IF
  453.  
  454.         PRINT
  455. ELSE
  456. END IF
  457.  
  458. IF INSTR(z$, "R") THEN
  459.  
  460.  
  461.         PRINT
  462.         PRINT "  Users taking advantage of Message Areas";
  463.         IF days > 0 THEN
  464.                 PRINT " during the last "; days; " days."
  465.         ELSE
  466.                 PRINT
  467.         END IF
  468.  
  469.         PRINT
  470.         PRINT "       User                 Last Called        Priv        "
  471.         PRINT "--------------------     -----------------    ------"
  472.         PRINT
  473. ELSE
  474. END IF
  475.  
  476. WHILE NOT EOF(1)
  477.     b$ = "": c$ = ""
  478.    
  479.     GOSUB GetName
  480.     GOSUB LastCalled
  481.     IF days = 0 OR days >= DaysSinceCalled THEN    ' check if user is current
  482.         GOSUB Counters                             '   /c option
  483.        
  484.         Pr$ = "    "
  485.         IF noprivs = 0 THEN GOSUB Privs
  486.                
  487.         GOSUB ShowArea  ' check areas read and determine whether to print
  488.     ELSE
  489.     END IF
  490.  
  491. WEND
  492.  
  493.    
  494. ' time to see if the summary report is wanted
  495.  
  496.     IF INSTR(z$, "A") THEN GOSUB BottomReport
  497.  
  498.  
  499. RETURN
  500.  
  501.  
  502.  
  503. BottomReport:
  504.  
  505.  
  506.  
  507. PRINT CHR$(12)      ' start with a fresh page by print a page break
  508.  
  509. PRINT               ' two fresh lines at the top
  510.  
  511. PRINT                                                ' not-so-sexy header
  512.  
  513. PRINT "                Number of Users reading Local and Echomail Areas"
  514. IF days > 0 THEN PRINT "                during the last "; days; " days."
  515.  
  516. PRINT
  517.  
  518. PRINT " Total Number of Users   "; user
  519. PRINT " Total Number of Users Surveyed  "; user1
  520.  
  521. PRINT
  522. PRINT " Area Number   Area Name             Number of Users"
  523. L10$ = "    ###      \                    \        ###"
  524.  
  525. ' if ANAME$(x) is null, then this area is a LOCAL message base.
  526. ' of course, the user of this program may not have an accurate input file!
  527.  
  528. ' lets print the report (even if longer than one page)
  529.  
  530.  
  531. FOR x = 1 TO MaxEcho      ' MaxEcho is assumed to be the highest message area
  532.        
  533.         IF ANAME$(x) = "" THEN ANAME$(x) = "(Local)"
  534.  
  535.         PRINT USING L10$; x, ANAME$(x), Counter(x)
  536.  
  537. NEXT
  538.  
  539. PRINT
  540. PRINT
  541.  
  542. FOR x = 1 TO 200
  543.  
  544.         TotalRead = TotalRead + Counter(x)       ' get a grand total of our
  545. NEXT x                                           ' success experiences.
  546.  
  547. PRINT "Total Area Activity Count ="; TotalRead
  548. PRINT
  549.  
  550. PRINT "Average Areas read per user surveyed =";
  551. PRINT USING " #.##"; TotalRead / user1
  552. RETURN    ' we are done with this program
  553.  
  554. PrintUser:
  555.    
  556.      PRINT USING "USER: & & &"; b$, c$, Pr$
  557.  
  558. ' message area
  559.  
  560.      PRINT USING L$; D(73), D(77), D(81), D(85), D(89), D(93), D(97), D(101)
  561.  
  562. ' last message read counter
  563.  
  564.      PRINT USING L1$; D(75), D(79), D(83), D(87), D(91), D(95), D(99), D(103)
  565.  
  566.      PRINT
  567.  
  568. RETURN
  569.  
  570.  
  571. '   THIS STARTS MIKE'S CODE
  572.  
  573.  
  574.  
  575. PAUSEKEY:
  576.         IF (Q$ = "p") OR (Q$ = "P") THEN GOSUB HOLD001: RETURN
  577.         IF (Q$ = "q") OR (Q$ = "Q") THEN CLOSE : PRINT : PRINT "Aborted by operator.": END
  578.         RETURN
  579.  
  580.  
  581. HOLD001:
  582.         PRINT "Display paused by operator...";
  583. HOLDKEY:
  584.         Q$ = INKEY$: IF Q$ = "" THEN GOTO HOLDKEY
  585.         PRINT
  586. RETURN
  587.  
  588. ShowArea:
  589.         trycount = 0
  590.                                            ' how many areas has he read?
  591.         FOR c = 75 TO 103 STEP 4
  592.                 IF D(c) <> 0 THEN trycount = trycount + 1
  593.         NEXT c
  594.  
  595. IF trycount = 0 AND INSTR(z$, "N") THEN      ' if he is a non-reader and
  596.                                              ' we have chosen the "N" option
  597.                                              ' this is the place to be.
  598.  
  599.         tt$ = STR$(trycount)
  600.         'trycount$ = LEFT$(tt$, LEN(tt$) - 1)
  601.         trycount$ = RIGHT$(tt$, LEN(tt$) - 1)
  602.  
  603. ShowUser:
  604.  
  605.         PRINT b$; TAB(25); c$; "  "; Pr$; "  ";
  606.         PRINT TAB(60);
  607.         PRINT "  Visited "; trycount$;
  608.         IF trycount = 8 THEN PRINT "+";
  609.         IF trycount = 8 THEN PRINT " areas." ELSE PRINT "  areas."
  610.         user1 = user1 + 1
  611. ELSEIF trycount > 0 AND INSTR(z$, "R") THEN   ' if he is a reader and we
  612.                                               ' have chosen the "R" option
  613.                                               ' this is the place to be.
  614.  
  615.       
  616.         tt$ = STR$(trycount)
  617.         'trycount$ = LEFT$(tt$, LEN(tt$) - 1)
  618.         trycount$ = RIGHT$(tt$, LEN(tt$) - 1)
  619.  
  620. ShowUser1:
  621.  
  622.         PRINT b$; TAB(25); c$; "  "; Pr$; "  ";
  623.         PRINT TAB(60);
  624.         PRINT "  Visited "; trycount$;
  625.         IF trycount = 8 THEN PRINT "+";
  626.         IF trycount = 8 THEN PRINT " areas." ELSE PRINT "  areas."
  627.         user1 = user1 + 1
  628.  
  629. ELSE
  630.  
  631.  
  632. END IF
  633.  
  634.  
  635. RETURN
  636.  
  637. 'this ends mike's code
  638.  
  639.  
  640. help:
  641.  
  642. CLS (0)
  643. PRINT "A message area usage checking utility from WalkBro & Kelleher."
  644. PRINT
  645. PRINT "Options-"
  646. PRINT
  647. PRINT "/c ##            - number of days since last call"
  648. PRINT "/p               - don't print Privs"
  649. PRINT "/o {options}     - desired output option"
  650. PRINT "/f {filename}    - input filename of area list"
  651. PRINT "/n               - NewOpus 1.10 (hex area numbers)"
  652. PRINT "/d               - use defaults (A output and Echo.lst for filename)"
  653. PRINT
  654. PRINT "Output options-   /o {options}"
  655. PRINT
  656. PRINT "R - List message readers       N - List Non Readers"
  657. PRINT "A - Just the area Use"
  658. PRINT "RA- List readers plus area use"
  659. PRINT "NA- List non readers plus area use"
  660. PRINT "RAD- List Readers with Detail and area use."
  661. PRINT
  662. PRINT "Sample command line -"
  663. PRINT "Message /c 30 /p /o RAD -f echo.lst > prn"
  664.  
  665. RETURN
  666.  
  667.  
  668.  
  669.  
  670. ' Subroutine to get command line and split into arguments
  671. ' Parameters : NumArgs : Number of command line args found
  672. '              Args$() : Array in which to return arguments
  673. '              MaxArgs : Maximum number of arguments array can
  674. '              return.
  675.  
  676. SUB Comline (NumArgs, Args$(), MaxArgs) STATIC
  677. CONST TRUE = -1, FALSE = 0
  678.  
  679.     NumArgs = 0: In = FALSE
  680. ' Get the command line using the COMMAND$ function
  681.     C1$ = UCASE$(COMMAND$)
  682.     L = LEN(C1$)
  683. ' Go through the command line a character at a time.
  684.     FOR I = 1 TO L
  685.        c$ = MID$(C1$, I, 1)
  686.     ' Test for character being blank or space.
  687.        IF (c$ <> " " AND c$ <> CHR$(9)) THEN
  688.     'Neither blank nor tab.
  689.     'Test to see if you're already inside an argument
  690.           IF NOT In THEN
  691.        'You've found the start of a new argument.
  692.        'Test for too many arguments
  693.               IF NumArgs = MaxArgs THEN EXIT FOR
  694.               NumArgs = NumArgs + 1
  695.               In = TRUE
  696.            END IF
  697.      'Add the character to the current argument
  698.            Args$(NumArgs) = Args$(NumArgs) + c$
  699.         ELSE
  700.     'Found a blank or Tab
  701.     'Set "Not in an argument" flag to FALSE.
  702.            In = FALSE
  703.         END IF
  704.     NEXT I
  705.  
  706. END SUB
  707.  
  708.